package banco.pessoa;

import excecoes.pessoa.CpfCnpjExistenteException;
import excecoes.pessoa.LocalizacaoInvalidaException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.JOptionPane;
import banco.Conexao;
import excecoes.estoque.DinheiroNegativoException;
import excecoes.pessoa.CpfCnpjInvalidoException;
import excecoes.pessoa.NomeInvalidoException;
import java.sql.Statement;
import smartMarket.pessoa.Cliente;
import smartMarket.pessoa.Pessoa;

public class BancoCliente extends Conexao {

    // Construtor
    public BancoCliente() {
        super();
    }

    //Métodos
    public void alterar(Cliente cliente) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("update cliente set nome = ?, cpf=?,uf=?,telefone=?,limite=?,endereco=?,bairro=?,cidade=?,fone2=?,email=? "
                + "where codigo = ?");
        st.setString(1, cliente.getNome());
        st.setString(2, cliente.getCPF_CNPJ());
        st.setInt(3, cliente.getEstado());
        st.setString(4, cliente.getTelefone());
        st.setFloat(5, cliente.getLimite());
        st.setString(6, cliente.getRua() + ", " + cliente.getNumero());
        st.setString(7, cliente.getBairro());
        st.setString(8, cliente.getCidade());
        st.setString(9, cliente.getCelular());
        st.setString(10, cliente.getEmail());
        st.setInt(11, cliente.getCodigo());
        st.execute();
        st.close();
        JOptionPane.showMessageDialog(null, "Cliente alterado com sucesso");
    }

    public void novo(Cliente cli) throws SQLException {
        
        PreparedStatement st = conexao.prepareStatement("insert into cliente(nome, cpf,uf,telefone,limite,endereco,bairro,cidade,fone2,email) "
                + "values (?,?,?,?,?,?,?,?,?,?)");

        st.setString(1, cli.getNome());
        st.setString(2, cli.getCPF_CNPJ());
        st.setInt(3, cli.getEstado());
        st.setString(4, cli.getTelefone());
        st.setFloat(5, cli.getLimite());
        st.setString(6, cli.getRua() + ", " + cli.getNumero());
        st.setString(7, cli.getBairro());
        st.setString(8, cli.getCidade());
        st.setString(9, cli.getCelular());
        st.setString(10, cli.getEmail());
        st.execute();
        st.close();
        JOptionPane.showMessageDialog(null, "Cliente cadastrado com sucesso");
    }

    public Cliente buscar(int codigo) throws SQLException, NullPointerException, NomeInvalidoException, DinheiroNegativoException, CpfCnpjInvalidoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        PreparedStatement st = conexao.prepareStatement("select * from cliente where codigo = ?");
        st.setInt(1, codigo);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return null;
        }
        return retornar(rs);
    }

    public Cliente buscar(String cpf) throws SQLException, NullPointerException, NomeInvalidoException, DinheiroNegativoException, CpfCnpjInvalidoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        PreparedStatement st = conexao.prepareStatement("select * from cliente where cpf = ?");
        st.setString(1, cpf);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            JOptionPane.showMessageDialog(null, "Nenhum cliente encontrado");
            return null;
        }
        return retornar(rs);
    }

    public void excluir(Cliente cliente) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("delete from cliente where codigo = ?");
        st.setInt(1, cliente.getCodigo());
        st.execute();
        JOptionPane.showMessageDialog(null, "Cliente excluido com sucesso");
    }

    private Cliente retornar(ResultSet rs) throws NullPointerException, SQLException, NomeInvalidoException, DinheiroNegativoException, CpfCnpjInvalidoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        Cliente cliente = new Cliente();
        cliente.setCodigo(rs.getInt("codigo"));
        cliente.setNome(rs.getString("nome"));
        cliente.setCPF_CNPJ(rs.getString("cpf"));
        cliente.setEstado(rs.getInt("uf"));
        cliente.setTelefone(rs.getString("telefone"));
        cliente.setRua(rs.getString("endereco").split(",")[0]);
        cliente.setNumero(rs.getString("endereco").split(",")[1]);
        cliente.setBairro(rs.getString("bairro"));
        cliente.setCidade(rs.getString("cidade"));
        cliente.setCelular(rs.getString("fone2"));
        cliente.setEmail(rs.getString("email"));
        cliente.setLimite(rs.getFloat("limite"));
        return cliente;
    }

    // Colocar exception para o null
    public int ultimoCodigo() throws SQLException {
        PreparedStatement st = conexao.prepareStatement("SELECT MAX(codigo) AS maximo FROM cliente");

        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return 1;
        }
        return rs.getInt("maximo");
    }

    public Vector<Pessoa> listar() throws SQLException, NullPointerException, NomeInvalidoException, DinheiroNegativoException, CpfCnpjInvalidoException, CpfCnpjExistenteException, LocalizacaoInvalidaException {
        Vector<Pessoa> clientes = new Vector<Pessoa>();
        PreparedStatement st = conexao.prepareStatement("select * from cliente ORDER BY CODIGO");
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return null;
        } else {
            clientes.add(retornar(rs));
            while (rs.next()) {
                clientes.add(retornar(rs));
            }
        }
        return clientes;
    }
    
    public Vector<Cliente> buscarNome(String nome) {

        try {
            Vector<Cliente> clientes = new Vector<Cliente>();
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery("select * from cliente where nome like '%" + nome + "%'");
            if (!rs.next()) {
                JOptionPane.showMessageDialog(null, "Nenhum produto encontrado");
                return null;
            } else {
                clientes.add(retornar(rs));
                while (rs.next()) {
                    clientes.add(retornar(rs));
                }
                return clientes;
            }
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar produto " + e.getMessage());
            return null;
        }
    } 
    
}
